import requests
import json
import pandas as pd
from typing import List, Dict


def fetch_all_etf_funds() -> List[Dict]:
    # 天天基金API接口 - 获取所有基金列表
    url = "http://fund.eastmoney.com/js/fundcode_search.js"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Referer': 'http://fund.eastmoney.com/'
    }
    try:
        response = requests.get(url, headers=headers)
        response.encoding = 'utf-8'
        content = response.text
        # 提取JSON部分
        json_str = content.split('=')[1].split(';')[0].strip()
        all_funds = json.loads(json_str)
        print(all_funds)
        # 筛选出ETF基金 - 名称中包含"ETF"的
        etf_funds = []
        for fund in all_funds:
            fund_code = fund[0]  # 基金代码
            fund_name = fund[2]  # 基金名称
            fund_type = fund[3]  # 基金类型

            # 筛选条件：名称中包含ETF或者是ETF联接基金
            if 'ETF' in fund_name and 'C' in fund_name:  # or 'ETF' in fund_type
                etf_funds.append({
                    'code': fund_code,
                    'name': fund_name,
                    'type': fund_type
                })

        return etf_funds
    except Exception as e:
        print(f"爬取失败: {e}")
        return []


def get_etf_detailed_info(fund_code: str) -> Dict:
    """
    获取单个ETF基金的详细信息，包括跟踪指数
    """
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Referer': f'http://fundf10.eastmoney.com/{fund_code}.html'
    }

    try:
        # 方法2：从基金档案页面获取更详细的信息
        archive_url = f"http://fundf10.eastmoney.com/jbgk_{fund_code}.html"
        archive_response = requests.get(archive_url, headers=headers)
        archive_response.encoding = 'utf-8'
        # 这里可以添加HTML解析代码来提取跟踪指数信息
        # 由于页面结构复杂，建议使用BeautifulSoup进行解析
        print(archive_response.text)
        return {
            'code': fund_code,
            'name': '',
            'type': '',
            'tracking_index': '需要进一步解析'
        }
    except Exception as e:
        print(f"获取基金 {fund_code} 详情失败: {e}")
        return {}


def main():
    """
    主函数：获取所有ETF基金并保存到Excel
    """
    print("开始爬取天天基金网ETF基金列表...")
    etf_funds = fetch_all_etf_funds()
    print(f"共找到 {len(etf_funds)} 只ETF基金")
    df = pd.DataFrame(etf_funds)
    filename = "C类(ETF)基金.xlsx"
    df.to_excel(filename, index=False)
    print(f"ETF基金列表已保存到: {filename}")

    print("\n前10只ETF基金:")
    for i, fund in enumerate(etf_funds[:10]):
        print(f"{i + 1}. {fund['code']} - {fund['name']} - {fund['type']}")


if __name__ == "__main__":
    # main()
    get_etf_detailed_info('005918')